package ricardotavares.util.hibernate;

import org.hibernate.cfg.Configuration;
import javax.swing.JOptionPane;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import ricardotavares.util.arquivo.Arquivos;
import ricardotavares.util.arquivo.JavaInfo;

/**
 * Esta classe é responsavél por configurar o Hibernate.
 * @author Ricardo
 */
public class HibernateUtil {

    private static String host, userName, password, port, dataBase, url, dialect, driver;
    private static Configuration configuration = new Configuration();
    private static SessionFactory sessions;
    private static Arquivos arquivos;
    private static JavaInfo javaInfo;

    static {
        try {
            arquivos = new Arquivos();
            javaInfo = arquivos.read();
            url = "jdbc:mysql://" + javaInfo.getHost() + ":" + javaInfo.getPort() + "/" + javaInfo.getDataBase();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Ops! erro na configuração.\n" + e, "Configurador do Hibernate", JOptionPane.ERROR_MESSAGE);
        }
    }

    private static void setParamentos(){
        // Verifica ser existir um arquivo JavaInfo de Configuração do Hibernate
        if (javaInfo != null) {
            configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver").setProperty("hibernate.connection.url", url).setProperty("hibernate.connection.username", javaInfo.getUserName()).setProperty("hibernate.connection.password", javaInfo.getPassword());
        } else {
            JOptionPane.showMessageDialog(null, "Para continuar configure o hibernate");
        }
    }

    /**
     * Responsavél por criar uma sessão.
     *
     * @return            Um objeto Session aberto.
     * @author            Ricardo Tavares
     */
    protected static Session getSession() {
        setParamentos();
        sessions = configuration.buildSessionFactory();
        return sessions.openSession();
    }

    /**
     * Adicione as Classes que foram mapiadas.
     *
     * @author            Ricardo Tavares
     */
    protected static void addClass(Class classe){
        configuration.addClass(classe);
    }

     /**
     * Responsavél por criar uma Sessio Factory.
     *
     * @return            Um objeto Session aberto.
     * @author            Ricardo Tavares
     */
    protected static SessionFactory getSessionFactory(){
        setParamentos();
        return configuration.buildSessionFactory();
    }

    protected static SessionFactory getFactory(){
        setParamentos();
        return configuration.buildSessionFactory();
    }
}

/*
 public static void main(String[] args) {
        try{
        Session s = Hibernate.getSession();
        s.beginTransaction();

        List<Dados> listaDados = (List<Dados>) s.createQuery("From Dados").list();

           for (Dados d : listaDados) {
               System.out.println("Curso: " + d.getNomeCurso());
           }

        s.getTransaction().commit();
        s.close();
        JOptionPane.showMessageDialog(null,"Conectado com Sucesso!");
        }catch(Exception e){
            JOptionPane.showMessageDialog(null,"Opa! erro na conexao.\n"+e,"Configurador do Hibernate",JOptionPane.ERROR_MESSAGE);
        }
    }
 */
